# -*- coding: utf-8 -*-
"""
梯度下降法的向量化处理
Created on Wed Feb 21 20:14:13 2018

@author: Allen
"""
import numpy as np
from playML.LinearRegression import LinearRegression
from playML.model_selection import train_test_split
from sklearn import datasets

boston = datasets.load_boston()
X = boston["data"]
y = boston["target"]

X = X[y<50]
y = y[y<50]

X_train, X_test, y_train, y_test = train_test_split( X, y, seed = 666 )

reg = LinearRegression()
reg.fit_normal( X_train, y_train )
r_squared = reg.score( X_test, y_test ) #0.81298026026585091

'''
直接使用梯度下降法，是无法计算出答案的，因为不收敛。
需要调整 eta 值。但是调整的程度又很难把握。

总结其原因，就是因为 数据的 跨度 很大，从 零点几 到 几百 都有。
因此，需要数据归一化处理！！！

reg1 = LinearRegression()
reg1.fit_gd( X_train, y_train )
r_squared = reg1.score( X_test, y_test ) #0.81298026026585091
'''
##############################################
#
# 使用梯度下降法前进行数据归一化*————重要
# 优点：
#   当数据量很大，特征比较多的时候，梯度下降比使用正规方程耗时要小
# 缺点：
#   当进行梯度下降时，所有的样本都参与了计算，当样本数量非常大的时候，计算效率很低
#   改进办法：
#       使用随机梯度下降
#
#
#########################################

from sklearn.preprocessing import StandardScaler

standardScaler = StandardScaler()
standardScaler.fit( X_train )
X_train_standard = standardScaler.transform( X_train )
X_test_standard = standardScaler.transform( X_test )

reg1 = LinearRegression()
reg1.fit_gd( X_train_standard, y_train )
r_squared1 = reg1.score( X_test_standard, y_test ) # 0.81298806201222351

'''
    切记：当数据见差距过大时，一定要数据归一化处理
'''